using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging.Messages;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ServoDrivesLib.Controls;
using ServoDrivesLib.Model;
using 雷赛板卡上位机.Models;
using 雷赛板卡上位机.View;
using Window = HandyControl.Controls.Window;

namespace 雷赛板卡上位机.ViewModel
{
    /// <summary>
    /// 启动视图模型类，负责启动和关闭应用程序的主要窗口。
    /// </summary>
    public partial class BootViewModel : BaseViewModel
    {
        private readonly Assembly assembly;
        /// <summary>
        /// 控制卡的类型属性，用于在ViewModel中存储和使用控制卡的类型信息。
        /// </summary>
        [ObservableProperty]
        private ControlType _controlType;

        /// <summary>
        /// 对话框结果属性，用于存储对话框的返回值。
        /// </summary>
        [ObservableProperty]
        private bool? dialogResult;


        public BootViewModel(Assembly assembly)
        {
            this.assembly = assembly ?? throw new ArgumentNullException(nameof(assembly));
        }
        /// <summary>
        /// 打开主窗口的方法，用于切换应用程序的主要窗口。
        /// </summary>
        [RelayCommand]
        private void ClickOpen()
        {
            // 获取当前主窗口
            var view = App.Current.MainWindow;
            // 将当前主窗口设置为新的MainWindowView实例
            App.Current.MainWindow = App.MyHost?.Services.GetRequiredService<MainWindowView>();
            // 设置新窗口的可见性为可见
            App.Current.MainWindow.Visibility = Visibility.Visible;
            // 关闭原来的主窗口
            view.Close();
        }

        /// <summary>
        /// 关闭应用程序的方法，用于关闭当前的主窗口。
        /// </summary>
        [RelayCommand]
        private void ClickClose()
        {
            // 获取当前主窗口并调用其关闭方法
            App.Current.MainWindow?.Close();
        }

        protected override void OnActivated()
        {
            // 注册一个消息处理程序，当接收到名为"ControlCard"的消息时，返回当前ViewModel中的_controlType属性值。
            Messenger.Register<BootViewModel, RequestMessage<ControlType>, string>(this, "ControlCard",
                (r, m) =>
                {
                    m.Reply(r.ControlType);
                });
        }
    }
}